
export default class Concurrent {
    private maxConcurrent: number = 2;
    private list: Function[] = [];
    private currentCount: number = 0;

    constructor(count: number = 2) {
        this.maxConcurrent = count;
    }
    public async add(fn: Function) {
        this.currentCount += 1;
        // 如果最大已经超过最大并发数
        if (this.currentCount > this.maxConcurrent) {
            // wait 是一个 Promise，只要调用 resolve 就会变成 fulfilled 状态
            const wait = new Promise((resolve) => {
                this.list.push(resolve);
            });
            // 在没有调用 resolve 的时候，这里会一直阻塞
            await wait;
        }
        // 执行函数
        await fn();
        this.currentCount -= 1;
        if (this.list.length) {
            // 把 resolve 拿出来，调用，这样 wait 就完成了，可以往下面执行了
            const resolveHandler = this.list.shift()!;
            resolveHandler();
        }

        return this;
    }
}